import pandas as pd
import matplotlib.pyplot as plt

try:
    # 读取 Excel 文件
    excel_file = pd.ExcelFile('ori_message.xlsx')
    sheet_names = excel_file.sheet_names

    dfs = []
    for sheet_name in sheet_names:
        df = excel_file.parse(sheet_name)
        df['年'] = df['年'].ffill()
        df['月'] = df['月'].ffill()
        dfs.append(df)

    combined_df = pd.concat(dfs, ignore_index=True)
    combined_df['年'] = combined_df['年'].astype(int)
    combined_df['月'] = combined_df['月'].astype(int)

    result = combined_df.groupby(['年', '月'])[['流量(m3/s)']].mean().round(2).reset_index()
    result = result.rename(columns={'流量(m3/s)': '平均流量(m3/s)'})

    # 按年、月排序，确保时间顺序
    result['排序键'] = result['年'] * 100 + result['月']
    result = result.sort_values(by='排序键')
    result.drop('排序键', axis=1, inplace=True)

    # 计算平均流量的平均值
    mean_w = result['平均流量(m3/s)'].mean()

    # 计算每个时间点的流量与平均值的差值
    result['W_minus_mean'] = result['平均流量(m3/s)'] - mean_w

    # 计算累积距平值
    result['累积距平'] = result['W_minus_mean'].cumsum()

    # 绘制累积距平曲线
    plt.figure(figsize=(12, 6))
    plt.plot(result['累积距平'], marker='o', linestyle='-', color='b')
    plt.xlabel('时间（年）', fontsize=12)
    plt.ylabel('累积距平值', fontsize=12)
    plt.title('2016 - 2021 年月均流量累积距平曲线', fontsize=14)

    # 获取每年第一个月的索引
    year_start_indices = result.groupby('年').head(1).index
    year_labels = result.loc[year_start_indices, '年']

    # 设置 x 轴刻度为年份
    plt.xticks(year_start_indices, year_labels, rotation=45, fontsize=10)

    plt.grid(True, linestyle='--', alpha=0.7)
    plt.tight_layout()
    plt.show()

except FileNotFoundError:
    print("错误: 未找到 'ori_message.xlsx' 文件，请检查文件路径和文件名。")
except KeyError as e:
    print(f"错误: 数据中缺少必要的列。错误信息: {e}，请检查数据列名。")
except Exception as e:
    print(f"发生未知错误: {e}")
